﻿using System;
using System.Configuration;
using System.Collections.Generic;
using System.Text;
using System.Web.Caching;
using RC.ControlAcceso.BaseDatos.GestionHorariaTableAdapters;

namespace RC.ControlAcceso.ObjetosNegocio
{    

    public class CA2Parametros
    {
        public static string TextoNoAsignado = "-no especificado-";
        private static CA2ParametroDeBDColeccion _parametros;
        private static CA2ParametroDeBDColeccion Parametros
        {
            get
            {
                if (_parametros == null)
                    _parametros = CA2ParametroDeBD.ObtenerTodos();
                return _parametros;
            }
        }

        private static string _RutaARaizDeAplicacion;
        private static string TarjetaEstado0 = "Libre";
        private static string TarjetaEstado1 = "Asignada";
        public static System.Drawing.Color ColorActivo = System.Drawing.Color.Green;
        public static System.Drawing.Color ColorInactivo = System.Drawing.Color.Red;
        

        #region Parametros de tarjetas
        /// <summary>
        /// Devuleve el equivalente en texto del estado de la tarjeta.
        /// </summary>
        /// <param name="pEstado"></param>
        /// <returns></returns>
        public static string TarjetaEstadoString(int pEstado)
        {
            if (pEstado == 0)
                return TarjetaEstado0;
            else if (pEstado == 1)
                return TarjetaEstado1;
            else
                throw new ArgumentException("Estado de tarjeta no válido");

        }
        #endregion
        /// <summary>
        /// Enumeración de los codigos de falta y los Id en la base de datos.
        /// </summary>
        public enum CodigosDeFaltaId
        {
            Franco = 1, 
            NoLaborable = 2,
            Suspension = 3,
            DiasTrabajados = 5
        }
        public enum TiposDeDocumento
        {
            DNI,
            CEDULA,
            LE,
            PASAPORTE
        }
        public static string RutaARaizDeAplicacion
        {
            get
            {
                if (_RutaARaizDeAplicacion != null)
                    return _RutaARaizDeAplicacion;
                else
                    return _RutaARaizDeAplicacion;
            }
            set
            {
                _RutaARaizDeAplicacion = value;
            }
        }
        public static int AreaIdEntradaPlanta
        {
            get
            {
                return int.Parse(ConfigurationSettings.AppSettings["AreaIdEntradaPlanta"]);
            }
            set
            {   
                ConfigurationSettings.AppSettings["AreaIdEntradaPlanta"] = value.ToString();
            }
        }

        public static string RutaDescargaExcelMarcas
        {
            get
            {
                return ConfigurationSettings.AppSettings["RutaDescargaExcelMarcas"].ToString();
            }
        }
        public static int AreaIdSalidaPlanta
        {
            get
            {
                return int.Parse(ConfigurationSettings.AppSettings["AreaIdSalidaPlanta"]);
            }
            set
            {
                ConfigurationSettings.AppSettings["AreaIdSalidaPlanta"] = value.ToString();
            }
        }
        /// <summary>
        /// Nombre de la empresa en la que se instalo el sistema.
        /// Obtenido desde la tabla de parametros del sistema.
        /// </summary>
        public static string EmpresaNombre
        {
            get
            {
                return Parametros.ObtenerValorPorNombre("Empresa");
            }
            set
            {
                Parametros.ModificarPorNombre("Empresa", value);
            }
        }
        /// <summary>
        /// Nombre de la empresa en la que se instalo el sistema.
        /// Obtenido desde web.config
        /// ConfigurationSettings.AppSettings["Cuit"];
        /// </summary>
        public static string EmpresaCUIT
        {
            get
            {
                return Parametros.ObtenerValorPorNombre("EmpresaCUIT");
            }
            set
            {
                Parametros.ModificarPorNombre("EmpresaCUIT", value);
            }
        }
        public static int MaximaCantidadDeHorasDesdeUltimaSincronizacion
        {
            get
            {
                int _resultado;
                if (int.TryParse(Parametros.ObtenerValorPorNombre("MaximaCantidadDeHorasDesdeUltimaSincronizacion"), out _resultado) == false)
                    return 2;
                else
                    return _resultado;
            }
            set
            {
                Parametros.ModificarPorNombre("MaximaCantidadDeHorasDesdeUltimaSincronizacion", value.ToString());
            }
        }
        public static string ClaveWebServiceDelfos
        {
            get
            {
                return Utiles.Encriptacion.Decrypt(Parametros.ObtenerValorPorNombre("ClaveWebServiceDelfos"), true);
            }
            set
            {
                value = Utiles.Encriptacion.Encrypt(value, true);
                Parametros.ModificarPorNombre("ClaveWebServiceDelfos", value);
            }
        }
        /// <summary>
        /// Es la cantidad de horas + - que busca marcas(en CAHistoricoMarca) el sistema desde la Hora entrada programada o salida programada.
        /// </summary>
        public static int CantidadHorasRangoBusquedaDeMarca
        {
            get
            {
                return int.Parse(ConfigurationSettings.AppSettings["CantidadHorasRangoBusquedaDeMarca"]);
            }
            set
            {
                ConfigurationSettings.AppSettings["CantidadHorasRangoBusquedaDeMarca"] = value.ToString();
            }
        }
        /// <summary>
        /// Ruta fisica donde se encutra la plantilla de payroll.
        /// </summary>
        public static string RutaPlantillaPayRoll
        {
            get
            {
                return ConfigurationSettings.AppSettings["RutaPlantillaPayRoll"];
            }
            set
            {
                ConfigurationSettings.AppSettings["RutaPlantillaPayRoll"] = value;
            }
        }
        /// <summary>
        /// ID de la empresa en la que se intaló el sistema. El id es el ID que tiene la empresa en la lista de la tabla CAEmpresa
        /// Obtenido desde web.config
        /// ConfigurationSettings.AppSettings["EmpresaID"];
        /// </summary>
        public static int EmpresaID
        {
            get
            {
                return int.Parse(ConfigurationSettings.AppSettings["EmpresaID"]);
            }
        }
        /// <summary>
        /// Es la fecha minima para todo el sistema.
        /// DateTime.Parse("01/01/1900"). Obtenida desde web.config
        /// </summary>
        public static DateTime FechaMinima
        {
          get 
          {
              return DateTime.Parse(ConfigurationSettings.AppSettings["FechaMinima"]);
          }
        }
        /// <summary>
        /// Devuelve el codigo de falta correspondiente para PayRoll
        /// </summary>
        /// <param name="pIdCodigoFalta"></param>
        /// <returns></returns>
        public static string ObtenerCodigoPayRoll(string ConceptoDeHora)
        {
            switch (ConceptoDeHora)
            {
                case "CantidadDias":
                    return "H00002";
                case "CantidadMinutosNocturnosSalubres":
                    return "H00100";
                case "CantidadMinutosNocturnosInsalubres":
                    return "H00105";
                case "CantidadHorasSalubresAdicionales50":
                    return "H00110";
                case "CantidadHorasSalubresAdicionales100":
                    return "H00115";
                case "CantidadHorasInsalubresAdicionales50":
                    return "H00120";
                case "CantidadHorasInsalubresAdicionales100":
                    return "H00125";
                case "CantidadHorasSalubresExtra50":
                    return "H00200";
                case "CantidadHorasSalubresExtra100":
                    return "H00205";
                case "CantidadHorasInsalubresExtra50":
                    return "H00210";
                case "CantidadHorasInsalubresExtra100":
                    return "H00215";
                case "CantidadHorasCurso":
                    return "Curso";
                case "Suspension":
                    return "H00044";
                case "Accidente":
                    return "H00030";
                case "Enfermedad":
                    return "H00045";
                case "LicenciasEspeciales":
                    return "H00050";
                case "PermisoGremial":
                    return "H00052";
                case "Vacaciones":
                    return "H00401";
                case "AdicionalVacaciones":
                    return "H00157";
                case "LicenciaPorMaternidad":
                    return "H00400";
                default:
                    throw new ArgumentException("Concepto no registrado.");
            }
        }
        /// <summary>
        /// Indica si el proceso de sincronización Chrono - Delfos tiene que ejecutarse.
        /// Es para el proceso automatico que consulta por nuevos Personal de Chrono a Delfos
        /// </summary>
        public static bool SincronizacionDelfosActiva
        {
            get
            {
                if (Parametros.ObtenerValorPorNombre("SincronizacionDelfosActiva") == "SI")
                    return true;
                else
                    return false;
            }
            set
            {
                if(value == true)
                    Parametros.ModificarPorNombre("SincronizacionDelfosActiva", "SI");
                else
                    Parametros.ModificarPorNombre("SincronizacionDelfosActiva", "NO");
            }
        }
        /// <summary>
        /// Indica si el proceso de sincronización Chrono - Delfos tiene que ejecutarse.
        /// Es para el proceso automatico que consulta por nuevos Personal de Chrono a Delfos
        /// </summary>
        public static bool EsModuloDeDelfos
        {
            get
            {
                if (Parametros.ObtenerValorPorNombre("EsModuloDeDelfos") == "SI")
                    return true;
                else
                    return false;
            }
            set
            {
                if (value == true)
                    Parametros.ModificarPorNombre("EsModuloDeDelfos", "SI");
                else
                    Parametros.ModificarPorNombre("EsModuloDeDelfos", "NO");
            }
        }
        /// <summary>
        /// El mínimo es 5
        /// </summary>
        public static int MinutosEntreSincronizacionesDeUsuariosConDelfos
        {
            get
            {
                int _resultado;
                int.TryParse(Parametros.ObtenerValorPorNombre("MinutosEntreSincronizacionesDeUsuariosConDelfos"), out _resultado);
                if (_resultado < 5)
                    _resultado = 5;
                return _resultado;
            }
            set
            {
                Parametros.ModificarPorNombre("MinutosEntreSincronizacionesDeUsuariosConDelfos", value.ToString());
            }
        }

        #region Bases de datos
        public static string ConexionBDContinuum
        {
            get
            {
                return ConfigurationSettings.AppSettings["ImpresionDeTicketsPorteriaNorteHabilitado"];
            }
        }
        #endregion

        #region METODOS
        /// <summary>
        /// Si no es válido, devuelve ""
        /// </summary>
        /// <param name="pTipoDocumento"></param>
        /// <returns></returns>
        public static string TipoDocumentoCorrecto(string pTipoDocumento)
        {
            if (pTipoDocumento == null)
                return TiposDeDocumento.DNI.ToString();
            if (pTipoDocumento.ToUpper() == TiposDeDocumento.CEDULA.ToString())
                return TiposDeDocumento.CEDULA.ToString();
            else if (pTipoDocumento.ToUpper() == TiposDeDocumento.DNI.ToString())
                return TiposDeDocumento.DNI.ToString();
            else if (pTipoDocumento.ToUpper() == TiposDeDocumento.LE.ToString())
                return TiposDeDocumento.LE.ToString();
            else if (pTipoDocumento.ToUpper() == TiposDeDocumento.PASAPORTE.ToString())
                return TiposDeDocumento.PASAPORTE.ToString();
            return ""; // no se encontro

        }
        #endregion
    }

    #region Clases de parametros con la BD
    public class CA2ParametroDeBD
    {
        #region Variables
        private int _ParametroId;
        private string _NombreParametro;
        private string _Valor;
        private string _Descripcion;

        #endregion

        #region Propiedades
        public int ParametroId
        {
            get { return _ParametroId; }
            set { _ParametroId = value; }
        }
        public string NombreParametro
        {
            get { return _NombreParametro; }
            set { _NombreParametro = value; }
        }
        public string Valor
        {
            get { return _Valor; }
            set { _Valor = value; }
        }
        public string Descripcion
        {
            get { return _Descripcion; }
            set { _Descripcion = value; }
        }
        #endregion

        #region Funciones
        /// <summary>
        /// Actualiza el objeto.
        /// </summary>
        /// <returns>No devuelve nada.</returns>
        public void Actualizar()
        {
            ActualizarDAL(NombreParametro, Valor, Descripcion, ParametroId);
        }
        public static CA2ParametroDeBD AsignarRowAObjeto(RC.ControlAcceso.BaseDatos.GestionHoraria.ParametrosRow pRow)
        {
            CA2ParametroDeBD _ParametroDeBD = new CA2ParametroDeBD();

            _ParametroDeBD.ParametroId = pRow.ParametroId;

            _ParametroDeBD.NombreParametro = pRow.NombreParametro;

            _ParametroDeBD.Valor = pRow.Valor;

            _ParametroDeBD.Descripcion = pRow.Descripcion;

            return _ParametroDeBD;
        }
        #endregion

        #region Interfase DAL
        //objeto de la capa DAL
        private static ParametrosTableAdapter _ParametrosTA;
        protected static ParametrosTableAdapter Adaptador
        {
            get
            {
                if (_ParametrosTA == null)
                    _ParametrosTA = new ParametrosTableAdapter();

                return _ParametrosTA;
            }
        }
        public bool ActualizarDAL(string pNombreParametro, string pValor, string pDescripcion, int pParametroId)
        {
            if (0 < Adaptador.Actualizar(pNombreParametro, pValor, pDescripcion, pParametroId))
            {
                return true;
            }
            else
                return false;
        }
        public static CA2ParametroDeBDColeccion ObtenerTodos()
        {
            RC.ControlAcceso.BaseDatos.GestionHoraria.ParametrosDataTable _parametrosDT = Adaptador.ObtenerTodos();
            return AsignarParametrosDataTableAColeccion(_parametrosDT);
        }
        protected static CA2ParametroDeBDColeccion AsignarParametrosDataTableAColeccion(RC.ControlAcceso.BaseDatos.GestionHoraria.ParametrosDataTable pDataTable)
        {
            CA2ParametroDeBDColeccion _ParametroColeccion = new CA2ParametroDeBDColeccion();
            CA2ParametroDeBD _Parametro;

            if ((pDataTable != null)
                && (pDataTable.Rows.Count > 0))
            {
                foreach (RC.ControlAcceso.BaseDatos.GestionHoraria.ParametrosRow _row in pDataTable.Rows)
                {
                    _Parametro = AsignarRowAObjeto(_row);
                    if (_Parametro != null)
                        _ParametroColeccion.Add(_Parametro);
                }
            }
            return _ParametroColeccion;
        }
        #endregion
    }
    public class CA2ParametroDeBDColeccion : System.Collections.CollectionBase
    {
        public void Add(CA2ParametroDeBD pParametroDeBD)
        {
            this.List.Add(pParametroDeBD);
        }
        public void Remove(int index)
        {
            if (index <= Count - 1 || index >= 0)
            {
                this.List.RemoveAt(index);
            }
            else
            {
                throw new System.ArgumentException("Fuera de rango", "original");
            }
        }
        public CA2ParametroDeBD this[int index]
        {
            get { return ((CA2ParametroDeBD)(this.List[index])); }
            set { this.List[index] = value; }
        }
        /// <summary>
        /// Si el parametro no existe, devuelve Null
        /// </summary>
        /// <param name="pNombre"></param>
        /// <returns></returns>
        public string ObtenerValorPorNombre(string pNombre)
        {
            foreach (CA2ParametroDeBD _parametro in this)
            {
                if (_parametro.NombreParametro == pNombre)
                {
                    return _parametro.Valor;
                }
            }
            return null;
        }
        public void ModificarPorNombre(string pNombre, string pValor)
        {
            foreach (CA2ParametroDeBD _parametro in this)
            {
                if (_parametro.NombreParametro == pNombre)
                {
                    _parametro.Valor = pValor;
                    _parametro.Actualizar();
                }
            }
        }
    }
    #endregion  
}
